#include "../include/kc.h"
#include "../include/defs.h"

/* Apartir de 8 mb */
int nextfree = 8192 * 1024 ;

int nextshmem = 0x0;

extern int pidActual;
extern int maxmem;

int initshmem = 0;

void *
Malloc (int size) {
    void *temp = (void *) nextfree;

    /* alinear a 4k */
    nextfree = nextfree + 2 * size + 4096 - (size % 4096);

    /* si ya era multiplo de 4k ocupe una pagina de mas */
    if (size % 4096 == 0)
        nextfree = nextfree - 4096;

    return temp;
}

void *
userMalloc (int size) {
    PROCESO *tmp;
    tmp = GetProcessByPid(pidActual);
    void *temp = 0x0;

    if ((tmp->nextfree + size) < (tmp->heapstart + tmp->heapsize)) {
        temp = (void *) tmp->nextfree;
        tmp->nextfree += size;
    }

    return temp;
}

void *
CallocTerm (int size) {
    int i = 0;
  //  char *temp;
 //   temp = (void *) Malloc (size);
    
     /* Temp tiene que poseer una direccion dentro de la zona
    del kernel */
    static char *temp = (char*) 0x300090;
     temp = temp + size;
    
    while (i < (80 * 25 * 2)) {
        temp[i] = ' ';
        i++;
        temp[i] = 0x07;
        i++;
    };
    /*for (i = 0; i < size; i ++ )
       {
       temp[i] = 0;
       temp[i+1] = 0x07;
       }
     */
    return (void *) temp;
}

void *
getSharedBlock(int size) {
    void *temp;

    if (!initshmem)
        nextshmem = (maxmem - 4 * 1024 * 1024) * 1024; // ultimos 4 mb

    /* verificar si queda memoria disponible para dar */
    if (nextshmem + size > maxmem)
        return 0x0;

    temp = (void *) nextshmem;
    nextshmem += size;

    return (void *) temp;
}
